############################################################################# # Question 1 : Mise en évidence du problème des flottants # ############################################################################# def calcul_recettes(): total = 0 prix_menu = 2.27 + 5.19 + 1.81 for _ in range(1000): for _ in range(500): total = total + prix_menu return total print(calcul_recettes()) #le résultat affiché n’est pas forcément exactement 4635000.0, mais une valeur très proche, à cause des erreurs de représentation des flottants en binaire. C’est précisément le phénomène expliqué dans l’énoncé. ############################################################################# # Question 2 : Conversion BCD vers Décimal # ############################################################################# # Écrire ci-dessous la fonction convertir_BCD_vers_decimal(liste_quartets) # et l'assertion de test demandée def convertir_BCD_vers_decimal(liste_quartets): chiffres = "" for quartet in liste_quartets: chiffres = chiffres + str(int(quartet, 2)) if len(chiffres) == 1: chiffres = "0" + chiffres partie_entiere = chiffres[:-2] partie_decimale = chiffres[-2:] if partie_entiere == "": partie_entiere = "0" return float(partie_entiere + "." + partie_decimale) assert convertir_BCD_vers_decimal(['0001', '0011', '0101', '0110']) == 13.56 ############################################################################# # Code fourni pour les questions 3 et 4 # ############################################################################# def convertir_dec_vers_BCD(decimal): """ Convertit une chaîne représentant un décimal vers une liste de quartets BCD. Convention : virgule implicite avant les deux derniers quartets. """ ajouter_zero = False liste_quartets = [] if '.' not in decimal: decimal = decimal + '.00' for i in range(len(decimal)): if decimal[i] != '.': quartet = bin(int(decimal[i]))[2:].zfill(4) liste_quartets.append(quartet) # Si le nombre n'a qu'un seul chiffre après la virgule if decimal[i] == '.' and i == len(decimal) - 2: ajouter_zero = True if ajouter_zero: liste_quartets.append('0000') return liste_quartets def additionner_binaire_quartets(quartet1, quartet2, retenue): """ Additionne bit à bit deux quartets binaire purs. Renvoie un tuple (somme_binaire_str, nouvelle_retenue_int). """ somme = "" for i in range(4): # Lecture de la droite vers la gauche bit1 = int(quartet1[3 - i]) bit2 = int(quartet2[3 - i]) total = bit1 + bit2 + retenue if total == 0: somme = '0' + somme retenue = 0 elif total == 1: somme = '1' + somme retenue = 0 elif total == 2: somme = '0' + somme retenue = 1 elif total == 3: somme = '1' + somme retenue = 1 return somme, retenue def corriger_BCD(somme, retenue): """ Applique la correction BCD si le quartet dépasse 9 ou génère une retenue. Ajoute '0110' (6) au quartet invalide. """ # Si somme >= 10 ('1010' ou '1011' ou '1100' etc.) if somme[0] == '1' and (somme[1] == '1' or somme[2] == '1'): somme, retenue = additionner_binaire_quartets(somme, '0110', 0) return somme, retenue # S'il y a eu dépassement naturel lors de l'addition binaire if retenue == 1: somme, _ = additionner_binaire_quartets(somme, '0110', 0) return somme, retenue return somme, retenue def aligner_quartets(q1: list, q2: list) -> tuple: """ Doit équilibrer les deux listes en ajoutant des '0000' à gauche de la liste la plus courte. """ while len(q1) < len(q2): # rajout q1.insert(0, '0000') while len(q2) < len(q1): # rajout q2.insert(0, '0000') return q1, q2 def additionner_nombres_format_BCD(a, b): """ Additionne deux nombres au format BCD, quartet par quartet. """ liste_quartets1 = convertir_dec_vers_BCD(a) liste_quartets2 = convertir_dec_vers_BCD(b) # Ajustement de la longueur liste_quartets1, liste_quartets2 = aligner_quartets(liste_quartets1, liste_quartets2) retenue = 0 resultat = [] longueur_max = max(len(liste_quartets1), len(liste_quartets2)) for i in range(longueur_max): index = longueur_max - i - 1 # Addition binaire simple des quartets somme, retenue = additionner_binaire_quartets(liste_quartets1[index], liste_quartets2[index], retenue) somme, retenue = corriger_BCD(somme, retenue) # rajout resultat.insert(0, somme) # Gestion de la dernière retenue éventuelle if retenue == 1: resultat.insert(0, '0001') return resultat print(additionner_nombres_format_BCD('27', '35')) print(additionner_nombres_format_BCD('23', '4'))